package pers.liyan.shi.springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;

/**
 * 一. 搭建基本环境
 *  1.创建表
 *  2.创建javaBean
 *  3.整合MyBatis
 *      1). 配置数据源信息
 *      2). 使用注解版MyBatis
 *          i.使用@MapperScan指定Mapper接口所在的包
 * 二. 快速体验缓存
 *  步骤:
 *      1.开启基于注解的缓存 @EnableCaching
 *      2.使用缓存注解
 *          @Cacheable
 *          @CachePut
 *          @CacheEvict
 *  默认使用ConcurrentMapCacheManager,可以创建和获取ConcurrentMapCache,数据保存在ConcurrentMap中
 *  开发中经常使用缓存中间件: Redis, memcache, ehcache
 *  三. 整合Redis作为缓存
 *      1. 使用docker安装redis
 *      2. 引入redisstarter
 *      3.配置redis
 *      4.测试缓存
 *          原理: 使用CacheManeger, Cache来操作缓存
 *          1).引入redis的starter之后, 容器中注入的是RedisCacheManager;
 *          2).RedisCacheManager使用RedisCache作为缓存组件
 *          3).默认缓存数据键值都是对象时使用jdk序列换后的数据
 *              i. 引入了redis的starter, 注入的CacheManager类型变为RedisCacheManager
 *              2. 默认创建的RedisCacheManager在操作数据时使用的是 RedisAutoConfiguration注入的 RedisTemplate<Object, Object> redisTemplate
 *              3.RedisAutoConfiguration注入的注入的RedisTemplate使用的是jdk的序列化器
 *          4).自定义CacheManager
 *
 *          如果RedisTemplate的序列化器没有正确的泛型会引起以下问题, 只能序列化缓存到redis, 在反序列化缓存到对象时会出错
 *          解决方法:使用cacheManager指定不同的CacheManager,不同的CacheManager中使用不同泛型的RedisTemplate
 *          有多个CacheManager是必须制定@Primary指定一个默认的@Primary
 */

@EnableCaching
@MapperScan(basePackages = {"pers.liyan.shi.springboot.mapper"})
@SpringBootApplication
public class SpringBootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootCacheApplication.class, args);
    }

}

